package com.extsci.webmail.mapper;

import com.extsci.webmail.common.entity.communicate.CommunicateGroup;
import com.extsci.webmail.common.entity.communicate.CommunicateUser;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * @author ccoke
 */
@Mapper
public interface CommunicateMapper {

    /**
     * 根据用户名获取整个通讯录组织结构
     * @param username 用户名
     * @return 整个通讯录组织结构
     */
    @Select("SELECT uuid, name FROM communicate_group WHERE username = #{username} ORDER BY create_at DESC")
    @Results({
            @Result(column = "uuid",property = "uuid"),
            @Result(column = "name",property = "name"),
            @Result(column = "uuid",property = "count", one = @One(select = "selectCountByGroupUuid")),
            @Result(column = "uuid",property = "users", one = @One(select = "selectUsersByGroupUuid"))
    })
    List<CommunicateGroup> selectAllByUsername(@Param("username") String username);

    /**
     * 根据用户名获取分组
     * @param username 用户名
     * @return 分组列表
     */
    @Select("SELECT uuid, name FROM communicate_group WHERE username = #{username} ORDER BY create_at DESC")
    @Results({
            @Result(column = "uuid",property = "uuid"),
            @Result(column = "name",property = "name"),
            @Result(column = "uuid",property = "count", one = @One(select = "selectCountByGroupUuid"))
    })
    List<CommunicateGroup> selectGroupsByUsername(@Param("username") String username);

    /**
     * 通过组uuid获取联系人数量
     * @param uuid 分组唯一ID
     * @return 联系人数量
     */
    @Select("SELECT COUNT(*) FROM communicate_user WHERE group_uuid = #{uuid}")
    Integer selectCountByGroupUuid(@Param("uuid") String uuid);

    /**
     * 根据分组Uuid获取分组
     * @param uuid 分组唯一ID
     * @return name 分组名称
     */
    @Select("SELECT * FROM communicate_group WHERE uuid = #{uuid}")
    CommunicateGroup selectGroupByUuid(@Param("uuid") String uuid);

    /**
     * 根据用户名与组名获取uid
     * @param username 用户名
     * @param name 分组名称
     * @return 分组唯一ID
     */
    @Select("SELECT uuid FROM communicate_group WHERE username = #{username} AND name = #{name} LIMIT 1")
    String selectGroupUuidByNameAndUserName(@Param("username") String username, @Param("name") String name);

    /**
     * 根据分组Uuid获取联系人
     * @param groupUuid 分组唯一ID
     * @return 联系人信息列表
     */
    @Select("SELECT uuid, group_uuid AS groupUuid, name, email FROM communicate_user WHERE group_uuid = #{groupUuid}  ORDER BY create_at DESC")
    List<CommunicateUser> selectUsersByGroupUuid(@Param("groupUuid") String groupUuid);

    /**
     * 插入分组
     * @param group 分组信息
     * @return 影响行数 < 1 失败
     */
    @Insert("INSERT INTO communicate_group VALUE(#{group.uuid}, #{group.name}, #{group.username}, #{group.createAt})")
    Integer insertGroup(@Param("group") CommunicateGroup group);

    /**
     * 插入联系人
     * @param user 联系人信息
     * @return 影响行数 < 1 失败
     */
    @Insert("INSERT INTO communicate_user VALUE(#{user.uuid}, #{user.groupUuid}, #{user.name}, #{user.email}, #{user.createAt})")
    Integer insertUser(@Param("user") CommunicateUser user);

    /**
     * 删除分组
     * @param username 用户名
     * @param uuid 用户唯一ID
     * @return 影响行数 < 1 失败
     */
    @Delete("DELETE FROM communicate_group WHERE uuid = #{uuid} AND username = #{username}")
    Integer deleteGroup(@Param("username") String username, @Param("uuid") String uuid);

    /**
     * 删除联系人
     * @param uuid 联系人唯一ID
     * @param groupUuid 分组唯一ID
     * @return 影响行数 < 1 失败
     */
    @Delete("DELETE FROM communicate_user WHERE uuid = #{uuid} AND group_uuid = #{groupUuid}")
    Integer deleteUser(@Param("uuid") String uuid, @Param("groupUuid") String groupUuid);

    /**
     * 根据Uuid修改分组名
     * @param username 用户名
     * @param uuid 分组唯一ID
     * @param name 分组名
     * @return 影响行数 < 1 失败
     */
    @Update("UPDATE communicate_group SET name = #{name} WHERE uuid = #{uuid} AND username = #{username}")
    Integer updateGroupName(@Param("username") String username, @Param("uuid") String uuid, @Param("name") String name);

    /**
     * 根据Uuid修改联系人
     * @param groupUuid 分组唯一ID
     * @param user 联系人信息
     * @return 影响行数 < 1 失败
     */
    @Update("UPDATE communicate_user SET name = #{user.name}, email = #{user.email} WHERE uuid = #{user.uuid} AND group_uuid = #{groupUuid}")
    Integer updateUser(@Param("groupUuid") String groupUuid, @Param("user") CommunicateUser user);

    /**
     * 移动联系人
     * @param uuid 联系人唯一ID
     * @param groupUuid 旧分组唯一ID
     * @param newgroupUuid 新分组唯一ID
     * @return 影响行数 < 1 失败
     */
    @Update("UPDATE communicate_user SET group_uuid = #{newgroupUuid} WHERE uuid = #{uuid} AND group_uuid = #{groupUuid}")
    Integer updateUserGroup(@Param("uuid") String uuid, @Param("groupUuid") String groupUuid, @Param("newgroupUuid") String newgroupUuid);

    /**
     * 移动整个分组联系人
     * @param groupUuid 旧分组唯一ID
     * @param newgroupUuid 新分组唯一ID
     * @return 影响行数 < 1 失败
     */
    @Update("UPDATE communicate_user SET group_uuid = #{newgroupUuid} WHERE group_uuid = #{groupUuid}")
    Integer updateUsersGroup(@Param("groupUuid") String groupUuid, @Param("newgroupUuid") String newgroupUuid);
}
